package com.tabnet.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;

import com.tabnet.beans.produit.Categorie;
import com.tabnet.dao.DAOCategorie;
import com.tabnet.dao.DAOException;
import com.tabnet.dao.DAOFactory;
import com.tabnet.dao.DAOUtilitaire;

public class CategorieDAOImpl implements DAOCategorie {
	
	private static final String SQL_SELECT_BY_ID  		= "SELECT * FROM Categorie c, SousCategorie s " 
														+ " WHERE c.SCAT_Ref = s.Ref_SCAT AND Ref_CAT = ?";
	
	private static final String SQL_LISTER		  		= "SELECT * FROM Categorie c, SousCategorie s " 
														+ " WHERE c.SCAT_Ref = s.Ref_SCAT";
	
	private DAOFactory daoFactory;
	
	public CategorieDAOImpl(DAOFactory daoFactory){
		this.daoFactory = daoFactory;
	}

	@Override
	public HashMap<String, Categorie> listerCategorie() throws DAOException {
		Connection connection = null;
	    PreparedStatement preparedStatement = null;
	    ResultSet resultSet = null;
	    HashMap<String, Categorie> lesCategories = new HashMap<String, Categorie>();
	    Categorie cat;
	
	    try {
	        connection = daoFactory.getConnection();
	        // récupération des fournissseurs
	        preparedStatement = DAOUtilitaire.initialisationRequetePreparee( connection, SQL_LISTER, false);
	        resultSet = preparedStatement.executeQuery();
	        while ( resultSet.next() ) {
	        	cat = map( resultSet );
	        	lesCategories.put(cat.getRef(), cat);
	        }
	    } catch ( SQLException e ) {
	        throw new DAOException( e );
	    } finally {
	        DAOUtilitaire.fermeturesSilencieuses( resultSet, preparedStatement, connection );
	    }
	
	    return lesCategories;
	}

	private static Categorie map( ResultSet resultSet ) throws SQLException {
		Categorie cat = new Categorie();
		
		cat.setRef( resultSet.getString( "Ref_CAT" ) );
		cat.setDescription( resultSet.getString( "Description_CAT" ) );
		cat.setSousCategorie(new Categorie(resultSet.getString( "Ref_SCAT" ), resultSet.getString( "Description_SCAT" )));
	
	    return cat;
	}

	@Override
	public Categorie trouverCategorie(String ref) throws DAOException {
		Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        Categorie cat = new Categorie();
        cat.setRef(ref);
        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            /*
             * Préparation de la requête avec les objets passés en arguments
             * (ici, uniquement un id) et exécution.
             */
            preparedStatement =  DAOUtilitaire.initialisationRequetePreparee( connexion, SQL_SELECT_BY_ID, false, ref );
            resultSet = preparedStatement.executeQuery();
            /* Parcours de la ligne de données retournée dans le ResultSet */
            if ( resultSet.next() ) {
            	cat.setDescription( resultSet.getString("Description_CAT") );
            	Categorie sousCat = new Categorie();
            	sousCat.setRef(resultSet.getString("Ref_SCAT"));
            	sousCat.setDescription(resultSet.getString("Description_SCAT"));
            	cat.setSousCategorie(sousCat);
            }
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
            DAOUtilitaire.fermeturesSilencieuses( resultSet, preparedStatement, connexion );
        }
		
		return cat;
	}

}
